package com.example.jee_springboot.jpa.repository;

import com.example.jee_springboot.jpa.dto.Stu2DTO;
import com.example.jee_springboot.jpa.dto.Stu2Java;
import com.example.jee_springboot.jpa.dto.Stu2Math;
import com.example.jee_springboot.jpa.entity.Stu2;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;

import javax.transaction.Transactional;
import java.util.List;

//查询Stu2实体，id是Long类型
public interface Stu2Repository extends JpaRepository<Stu2,Long>, JpaSpecificationExecutor<Stu2> {
     //只需要定义方法名就可以了
    List<Stu2> findByUsername(String username);

    //模糊查询

    List<Stu2> readByUsernameLike(String part);

    //范围查询
    List<Stu2> readByJavaBetween(double min,double max);

    List<Stu2DTO> findByUsernameEndsWithIgnoreCaseAndJavaBetweenOrderByIdDescJavaDesc(String username, double javaStart, double javaEnd);
//    //upper(s1_0.username) like upper(?) escape '\'
    //忽略大小写
    List<Stu2> readByUsernameLikeIgnoreCase(String part);
    //多条件查询用 and即可
    List<Stu2> findByUsernameContainingIgnoreCaseAndJavaBetween(String part,double min,double max);
    //多条件查询返回数量
    long countByUsernameContainingIgnoreCaseAndJavaBetween(String part,double min,double max);
    //多条件查询返回删除的数量
     int removeByUsernameContainingIgnoreCaseAndJavaBetween(String part,double min,double max);
    List<Stu2> findByUsernameLikeOrderByJava(String part);//升序
    List<Stu2> findByUsernameLikeOrderByJavaDesc(String part);//降序
    List<Stu2> findByUsernameLikeOrderByJavaDescId(String part);//java降序 id升序

//    //List<Stu2> findByIsbn(String isbn);//有问题的函数
//
//    List<Stu2DTO> findByUsernameEndsWithIgnoreCaseAndJavaBetweenOrderByIdDescJavaDesc(String username, double javaStart, double javaEnd);


    //想要实现分页只用传一个参数 Pageable pageable即可 如下！！！！！！
    List<Stu2> findBy(PageRequest pageable);
//    List<Stu2> findBy(Sort sort);
    List<Stu2> findTop2By(Sort sort);


    ///投影方式返回部分值
    List<Stu2Java> queryBy();
    List<Stu2Math> searchBy();

    //定义动态投影     可以声明接口的基础上 只写一个方法 取代上面两个方法
    <T>List<T> searchAllBy(Class<T> type);

//respository中定义同名方法如下 就可以使用了 注意参数名字 也要如下为username  不可以是（String part)
    List<Stu2> findByUsername2(String username);

    @Query(value = "select* from stu2",nativeQuery = true)
    List<Stu2> findByNativeQuery();

    //查询操作有无事务无所谓 但是修改操纵必须有事务

    @Query("DELETE  FROM Stu2 where id=32")
    //默认都是select查询 所以我们要指定我们这一个不是select查询
    @Modifying//异常需要select
    @Transactional//异常需要事务
    public int deleteByIdByJpal();


}